import { IllegalArgumentException, IllegalStateException } from "./exception.js";
import Utils from "./utils";

/**
 * 状态不为真时抛出异常。
 *
 * @param obj 要检测的对象
 * @param message 报错信息
 * @throws IllegalStateException - 非法状态异常
 */
const state = (obj, message) => {
    if (!obj) {
        throw new IllegalStateException(message);
    }
};

/**
 * 对象不为真时抛出异常。
 *
 * @param obj 要检测的对象
 * @param message 报错信息
 * @throws IllegalArgumentException - 对象不为 true
 */
const isTrue = (obj, message) => {
    if (!obj) {
        throw new IllegalArgumentException(message);
    }
};

/**
 * 非法参数输入
 *
 * @param obj 要检测的对象
 * @param message 报错信息
 * @throws IllegalArgumentException - 非法参数输入
 */
const notBlank = (obj, message) => {
    if (Utils.isBlank(obj)) {
        throw new IllegalArgumentException(message);
    }
};

/**
 * 判断对象是不是为空
 *
 * @param obj 要检测的对象
 * @param message 报错信息
 */
const notEmpty = (obj, message) => {
    if (Utils.isEmpty(obj)) {
        throw new IllegalArgumentException(message);
    }
};

/**
 * 判断对象是不是指定类型
 *
 * @param type - 类型
 * @param obj - 要检测的对象
 * @param message - 报错信息
 */
const isTypeOf = (type, obj, message) => {
    if (typeof obj !== type) {
        throw new IllegalArgumentException(message);
    }
};

/**
 * 判断一个对象是不是处在另一个对象原型链上
 *
 * 注意函数名：因为要避免和内置函数重名，函数名中的 Type 首字母大写
 *
 * @param type - 父类
 * @param obj - 要检测的对象
 * @param message - 报错信息
 */
const isProtoTypeOf = (type, obj, message) => {
    if (!type.prototype.isPrototypeOf(obj)) {
        throw new IllegalArgumentException(message);
    }
};

export default { state, isTrue, notBlank, notEmpty, isTypeOf, isProtoTypeOf };